home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJSRC111.ZIP / go32 / mono.c < prev    next >
C/C++ Source or Header  |  1993-11-13  |  2KB  |  120 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <io.h>
  4. #include <string.h>
  5.  
  6. #include "mono.h"
  7.  
  8. extern int use_mono;
  9.  
  10. int screen_seg = 0xb800;
  11. int mono_attr = 0x07;
  12.  
  13. static int row=-1,col=-1;
  14.  
  15. static void mono_putc(char c)
  16. {
  17.   int i;
  18.   switch (c)
  19.   {
  20.     case 13:
  21.       col = 0;
  22.       break;
  23.     case 10:
  24.       col = 0;
  25.       row ++;
  26.       if (row == 25)
  27.       {
  28.         for (i=160; i<24*160; i++)
  29.           pokeb(0xb000, i, peekb(0xb000, i+160));
  30.         for (; i<25*160; i+=2)
  31.           poke(0xb000, i, 0x0720);
  32.         row--;
  33.       }
  34.       break;
  35.     case 9:
  36.       do {
  37.         col++;
  38.       } while (col % 8);
  39.       break;
  40.     case 8:
  41.       if (col > 0)
  42.         col--;
  43.       break;
  44.     case 7:
  45.       write(1, "\a", 1);
  46.       break;
  47.     case 12:
  48.       for (i=0; i<25*160;)
  49.       {
  50.         pokeb(0xb000, i++, 0x20);
  51.         pokeb(0xb000, i++, 0x07);
  52.       }
  53.       row = 6;
  54.       col = 0;
  55.       break;
  56.     default:
  57.       pokeb(0xb000, row*160+col*2, c);
  58.       pokeb(0xb000, row*160+col*2+1, mono_attr);
  59.       col++;
  60.       if (col == 80)
  61.       {
  62.         mono_putc(10);
  63.       }
  64.       break;
  65.   }
  66. }
  67.  
  68. int printf(const char *fmt, ...)
  69. {
  70.   char buf[200];
  71.   int i;
  72.   int n = vsprintf(buf, fmt, ...);
  73.   if (use_mono)
  74.   {
  75.     if (col == -1)
  76.       mono_putc(12);
  77.  
  78.     for (i=0; buf[i]; i++)
  79.       mono_putc(buf[i]);
  80.  
  81.     outportb(0x3b4, 15);
  82.     outportb(0x3b5, row*80+col);
  83.     outportb(0x3b4, 14);
  84.     outportb(0x3b5, (row*80+col)/256);
  85.   }
  86.   else
  87.     write(1, buf, strlen(buf));
  88.   return n;
  89. }
  90.  
  91. void mputchar(char c)
  92. {
  93.   if (use_mono)
  94.   {
  95.     mono_putc(c);
  96.     outportb(0x3b4, 15);
  97.     outportb(0x3b5, row*80+col);
  98.     outportb(0x3b4, 14);
  99.     outportb(0x3b5, (row*80+col)/256);
  100.   }
  101.   else
  102.     write(1, &c, 1);
  103. }
  104.  
  105. int mono_write(char *buf, int len)
  106. {
  107.   int i;
  108.   if (col == -1)
  109.     mono_putc(12);
  110.  
  111.   for (i=0; i<len; i++)
  112.     mono_putc(buf[i]);
  113.  
  114.   outportb(0x3b4, 15);
  115.   outportb(0x3b5, row*80+col);
  116.   outportb(0x3b4, 14);
  117.   outportb(0x3b5, (row*80+col)/256);
  118.   return len;
  119. }
  120.